package com.wulinbus.service.impl;

import java.io.IOException;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.fancy.common.results.Results;
import com.fancy.common.utils.FileUtil;
import com.fancy.common.utils.retry.RetryUtil;
import com.fancy.common.utils.retry.RetryUtil.RetryHandler;
import com.wulinbus.service.FileStoreService;
import com.wulinbus.utils.FileStore;

/**
 * 文件存储Service 采用又拍CDN加速，故本地存储的同时,Copy一份到又拍云存储上， <br>
 * 并同时生成适合各个客户端分辨率的图片。
 * 
 */
@Service
public class FileStoreServiceImpl implements FileStoreService {

	/**
	 * 保存图片URL到文件，异常重试3次
	 * 
	 * @param url
	 * @param fileType
	 * @return
	 */
	@Override
	public Results<String> saveImageByUrl(final String url, final String fileType,final String uniqueTag) {

		// 保存URL到文件，异常重试3次
		final Results<String> result = RetryUtil.retry(3, new RetryHandler<Results<String>>() {
			@Override
			public Results<String> execute() {
				return FileUtil.saveFile(url, fileType,uniqueTag);
			}
		});

		if (result.isSuccess()) {                         
			// 保存文件到又拍，异常重试3次
			copyImageToUpYunByReTry(result.getObject());         
		}
		return result;
	}

	/**
	 * 保存上传的图片到文件，异常重试3次
	 * 
	 * @param image
	 * @param fileType
	 * @return
	 * @throws Exception
	 */
	@Override
	public Results<String> saveImage(final String uploadflag,final MultipartFile image, final String fileType) {

		// 保存上传的图片到文件，异常重试3次
		final Results<String> result = RetryUtil.retry(3, new RetryHandler<Results<String>>() {
			@Override
			public Results<String> execute() 
			{
				return FileStore.saveImage(uploadflag,image, fileType);
			}
		});

		if (result.isSuccess()) {
			// 保存文件到又拍，异常重试3次
			//copyImageToUpYunByReTry(result.getObject());
		}
		return result;
	}
	
	@Override
	public Results<String> saveFile(final String uploadflag,final MultipartFile file, final String fileType,final String uniqueTag)
			throws Exception {
		// 保存上传的图片到文件，异常重试3次
		final Results<String> result = RetryUtil.retry(3, new RetryHandler<Results<String>>() {
			@Override
			public Results<String> execute() {
				return FileStore.saveFile(uploadflag,file, fileType,uniqueTag);
			}
		});

		if (result.isSuccess()) {
			// 保存文件到又拍，异常重试3次
			//copyImageToUpYunByReTry(result.getObject());
		}
		return result;
	}



	/**
	 * 保存文件到又拍，异常重试3次
	 * 
	 * @param filePath
	 * @return
	 */
	private boolean copyImageToUpYunByReTry(final String filePath) {
		// 保存文件到又拍，异常重试3次
		return RetryUtil.retry(3, new RetryHandler<Boolean>() {
			@Override
			public Boolean execute() throws IOException {
				boolean r = FileUtil.copyImageToUpYun(filePath);
				if (!r) {
					throw new RuntimeException("copy image to upyun error. file:" + filePath);
				}
				return r;
			}
		});
	}
}
